#include <string.h>
#include "cJSON/cJSON.h"
#include <stdlib.h>
#include "log/log.h"
#include "app_common.h"

/*
消息数据包含
    连接类型：1 代表蓝牙连接
    设备id: "xx"
    消息体内容: "abcd"
字符数组格式： 1 2 4 xxabcd
    字节1：连接类型
    字节2：设备id长度
    字节3：消息体长度
    字节4~n：设备id和消息体
json格式: {"conn_type": 1, "id": "5858", "msg": "61626364"}
        
*/
char *app_message_charsToJson(char *chars, int chars_len) { // 1 2 4 xxabcd
    // 从chars中提取出conn_type, id_len, msg_len, id, msg
    int conn_type = (int)chars[0];
    int id_len = (int)chars[1];
    int msg_len = (int)chars[2];
    char id[id_len];
    char msg[msg_len];
    memcpy(id, chars+3, id_len);
    memcpy(msg, chars+3+id_len, msg_len);

    // 生成id和msg对应的16进制字符串 id_hex, msg_hex
    char *id_hexstr = app_common_charsToHexstr(id, id_len); // "5858"
    char *msg_hexstr = app_common_charsToHexstr(msg, msg_len); // "61626364"

    // 生成json字符串消息
    cJSON *root = cJSON_CreateObject();
    cJSON_AddNumberToObject(root, "conn_type", conn_type);
    cJSON_AddStringToObject(root, "id", id_hexstr);
    cJSON_AddStringToObject(root, "msg", msg_hexstr);
    char *json = cJSON_PrintUnformatted(root);

    // 释放内存
    cJSON_Delete(root);
    free(id_hexstr);
    free(msg_hexstr);

    // 返回json
    return json;
}

/*
消息数据包含
    连接类型：1 代表蓝牙连接
    设备id: "xx"
    消息体内容: "abcd"
字符数组格式： 1 2 4 xxabcd
    字节1：连接类型
    字节2：设备id长度
    字节3：消息体长度
    字节4~n：设备id和消息体
json格式: {"conn_type": 1, "id": "5858", "msg": "61626364"}
        
*/
int app_message_jsonToChars(char *json, char *chars_buf, int buf_len) {
    // 解析json,得到conn_type, id_hex, msg_hex
    cJSON *root = cJSON_Parse(json);
    int conn_type = cJSON_GetObjectItem(root, "conn_type")->valueint;
    char *id_hex = cJSON_GetObjectItem(root, "id")->valuestring;
    char *msg_hex = cJSON_GetObjectItem(root, "msg")->valuestring;

    // 将id_hex和msg_hex转换为对应的字符数组id和msg,并得到其长度id_len和msg_len
    int id_len = 0;
    char *id = app_common_hexstrToChars(id_hex, &id_len);
    int msg_len = 0;
    char *msg = app_common_hexstrToChars(msg_hex, &msg_len);
    // 数据长度校验
    int data_len = 3 + id_len + msg_len;
    if (data_len > buf_len) {
        log_error("数据长度超过了容器大小");
        return -1;
    }

    // 将conn_type, id_len, msg_len, id, msg写入chars_buf中
    chars_buf[0] = conn_type;
    chars_buf[1] = id_len;
    chars_buf[2] = msg_len;
    memcpy(chars_buf+3, id, id_len);
    memcpy(chars_buf+3+id_len, msg, msg_len);

    // 释放内存
    cJSON_Delete(root);
    free(id);
    free(msg);


    // 返回写入的长度
    return data_len;
}